package com.example.framework;


import lombok.Data;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Data
public class GQViewResolver {

    // 模板名称
    private String viewName;

    // 模板的文件 File
    private File file;

    /**
     * @param viewName 模板名称
     * @param file     模板的文件 File
     */
    protected GQViewResolver(String viewName, File file) {
        this.viewName = viewName;
        this.file = file;
    }

    /**
     * 解析
     *
     * @return RandomAccessFile(File file, String mode)
     * mode:
     * r    以只读的方式打开文本，也就意味着不能用write来操作文件
     * rw	读操作和写操作都是允许的
     * rws	每当进行写操作，同步的刷新到磁盘，刷新内容和元数据
     * rwd	每当进行写操作，同步的刷新到磁盘，刷新内容
     */
    protected String parse(GQModelAndView mv) {
        RandomAccessFile ra = null;
        try {
            new RandomAccessFile(this.file, "r");
            StringBuffer sb = new StringBuffer();
            // 模板框架的语法是非常复杂的，但是原理都是一样的，无非都是用正则表达式来处理字符串而已
            // 就这么简单不要认为这个框架的语法是多么的高大上
            // 我们现在做一个最接地气的模板
            String line = "";
            while (null != (line = ra.readLine())) {
                Matcher matcher = matcher(line);
                while (matcher.find()) {
                    for (int i = 0; i < matcher.groupCount(); i++) {
                        String paramName = matcher.group(i);
                        Object paramValue = mv.getModel().get(paramName);
                        if (null != paramValue) {
                            line = line.replaceAll("@\\{" + paramName + "\\}", paramValue.toString());
                        }
                    }
                }
                sb.append(line);
            }
            return sb.toString();
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        } finally {
            if (ra != null) {
                try {
                    ra.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    /**
     * 传入字符串返回 matcher
     *
     * @param str
     * @return
     */
    private Matcher matcher(String str) {
        Pattern pattern = Pattern.compile("@\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);
        return pattern.matcher(str);
    }
}
